package smallfrench.moteur.lexer;

import smallfrench.moteur.lexer.err.ErreurLexemeAttendu;
import smallfrench.moteur.lexer.err.ErreurLexemeInattendu;
import smallfrench.moteur.lexer.err.ErreurLexer;
import smallfrench.moteur.lexer.lexemes.Lexeme;
import smallfrench.moteur.lexer.lexemes.LexemeEntier;
import smallfrench.moteur.lexer.lexemes.LexemeFlottant;

public class AutomateNombre extends Automate {

	@Override
	public Lexeme analyser(LecteurChaine lecteur, Position debut)
			throws ErreurLexer {

		char c = lecteur.suivant();

		if (Character.isDigit(c)) {

			boolean virgule = false;
			StringBuilder sb = new StringBuilder();
			sb.append(c);

			while (! lecteur.isEof()) {

				c = lecteur.suivant();

				if (Character.isDigit(c)) {
					sb.append(c);

				} else if (c == ',') {

					if (virgule) {
						throw new ErreurLexemeInattendu(
								",", lecteur.getPosition());
					}
					virgule = true;
					sb.append('.');

				} else {
					lecteur.precedent();
					break;
				}
			}

			String s = sb.toString();

			if (virgule) {

				if (s.endsWith(".")) {
					throw new ErreurLexemeAttendu("chiffre",
							lecteur.getPosition());
				}

				return new LexemeFlottant(Double.parseDouble(s),
						debut, lecteur.getPosition());
			} else {
				return new LexemeEntier(Long.parseLong(s),
						debut, lecteur.getPosition());
			}
		}
		lecteur.precedent();
		return null;
	}

}
